#include "usart.h"
#include "serial.h"
#include <stdio.h>
#include <string.h>

#define RX_BUFFER_SIZE 256
uint8_t U1_RxBuffer[256];
uint16_t U1_RxDataCnt;
uint8_t U1_RxData;
/**
  * 函    数：使用printf需要重定向的底层函数
  * 参    数：保持原始格式即可，无需变动
  * 返 回 值：保持原始格式即可，无需变动
  */
int fputc(int ch, FILE *f) {
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);  //串口printf发送开关
    return ch;
}

/**
  * 函    数：串口初始化
  * 参    数：无
  * 返 回 值：无
  */
void Serial_Init(void)
{
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&U1_RxData, 1);
}

/**
  * 函    数：串口发送一个字节
  * 参    数：Byte 要发送的一个字节
  * 返 回 值：无
  */
void Serial_SendByte(uint8_t Byte)
{
	HAL_UART_Transmit(&huart1, &Byte, 1, HAL_MAX_DELAY);
	while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
}

/**
  * 函    数：串口发送一个字符串
  * 参    数：String 要发送字符串的首地址
  * 返 回 值：无
  */
void Serial_SendString(char *String)
{
	while(*String)
	{
		Serial_SendByte(*String++);
	}
}

/**
  * 函    数：串口1接收回调函数
  * 参    数：uint8_t Byte:接收的一个字节
  * 返 回 值：无
  * 注意：在usart.c的中断中调用
  */
void usart1_receive_callback(uint8_t Byte)
{
	U1_RxBuffer[U1_RxDataCnt++] = Byte;   //接收数据转存
	
	if(U1_RxDataCnt > RX_BUFFER_SIZE) 	//判断接收数据是否溢出
	{
		memset(U1_RxBuffer,0x00,sizeof(U1_RxBuffer));	//清除缓存
		U1_RxDataCnt = 0;	//下标置0，重新开始接收
	}				

	if((U1_RxBuffer[U1_RxDataCnt - 2] == '\r' && U1_RxBuffer[U1_RxDataCnt - 1] == '\n')) //判断结束位
	{
		Serial_SendString((char *)U1_RxBuffer);			//打印接收到的数据
		memset(U1_RxBuffer,0x00,sizeof(U1_RxBuffer)); //清空数组
		U1_RxDataCnt = 0;								
	}	
}
